package aufgabe2;

import java.util.ArrayList;

import aufgabe1.MesswerteListe;

public class MatrixGenerator {
	/**
	 *  Generiert eine zufaellige Matrix des gegebenen Typs
	 * @param type Matrix des Gewuenschten Typs
	 * @param groese der Matrix als n x n
	 * @param parUnNul jede wievielte Stelle soll ungleich null sein
	 * @param zufall Obergrenze fuer die Werte.
	 * @return Eine Matrix des Gewuenschten Typs mit zufaelligen Werten
	 */
	public static ImplementationMathMatrix genRandMatrix(ImplementationMathMatrix type, int groese, double parUnNul, double zufall){
		ImplementationMathMatrix newMatrix = aufgabe2.Matrix.getMatrixOfType(type, groese, groese);
		
		int zeilen;
		int spalten;
		
		for(zeilen = 0; zeilen < groese; zeilen++){
			for(spalten = 0 ; spalten < groese; spalten++){
				if(Math.random() * 100 < parUnNul){
					newMatrix.setMatrixMN(zeilen, spalten, Math.random() * zufall);
				}
			}
		}
		return newMatrix;
	}
	/**
	 * Kopiert eine Matrix auf einen anderen Typ
	 * @param type Typ der gewuenschten Matrix
	 * @param matrix Matrix die kopiert werden soll.
	 * @return Kopierte Matrix
	 */
	public static ImplementationMathMatrix dupMatrixToType(ImplementationMathMatrix type, ImplementationMathMatrix matrix){
		ImplementationMathMatrix newMatrix = aufgabe2.Matrix.getMatrixOfType(type, matrix.getHoehe(), matrix.getBreite());
		
		int zeile;
		int spalte;
		
		for(zeile = 0; zeile < matrix.getHoehe(); zeile++){
			for(spalte = 0 ; spalte < matrix.getBreite(); spalte++){
				newMatrix.setMatrixMN(zeile, spalte, (matrix.getMatrixMN(zeile, spalte)));
			}
		}
		return newMatrix;
	}
	
	public static int getWerteNotNull(ImplementationMathMatrix matrix){
		
		int werte = 0;
		int zeile;
		int spalte;
		
		for(zeile = 0; zeile < matrix.getHoehe(); zeile++){
			for(spalte = 0 ; spalte < matrix.getBreite(); spalte++){
				if(matrix.getMatrixMN(zeile, spalte) != 0.0){
					werte++;
				}
			}
		}
		return werte;
	}
	
	public static void print(ImplementationMathMatrix matrix){
		
		
		int zeile;
		int spalte;
		
		for(zeile = 0; zeile < matrix.getHoehe(); zeile++){
			ArrayList<Double> zeilen = new ArrayList<Double>();
			for(spalte = 0; spalte < matrix.getBreite(); spalte++){
				zeilen.add(matrix.getMatrixMN(zeile, spalte));
			}
			System.out.println(zeilen.toString());
		}
		System.out.println();
	}
	
	
	public static void main(String[] args){
		MesswerteListe messwerteAdd = new  MesswerteListe();
		int groese = 50;
		
		
		for(int y = 0; y < 100000; y++){
			for(int x = 0; x < 10; x++){
				ImplementationMathMatrix matrix = aufgabe2.Matrix.getMatrixOfArrayList(1009,1009);
				//ImplementationMathMatrix matrix = genRandMatrix(type, groese, 5, 1000.0);
				//ImplementationMathMatrix matrix2 = genRandMatrix(type, groese, 5, 1000.0);
				
				//matrix.resetReferenceCounter();
				//matrix2.resetReferenceCounter();
				
				//System.out.println();
				
				//matrix.mul(matrix2);

				int zeile;
				int spalte;
				int werte = 0;
				int parUnNul = 10;
				
				for(zeile = 0; zeile < matrix.getHoehe(); zeile++){
					for(spalte = 0 ; spalte < matrix.getBreite(); spalte++){
						if(Math.random() * 100 < parUnNul){
							werte++;
						}
					}
				}
				
				
				messwerteAdd.add(werte);

			}
			System.out.println("Werte Add: " + messwerteAdd.getAnzahlWerte());
			System.out.println("Mittelwert Add: " + messwerteAdd.getMittelwert());
			System.out.println("Varianz Add: " + messwerteAdd.getVarianz());

		}
	}
		

//	public static void main(String[] args){
//		
//		int sice = 5;
//		ImplementationMathMatrix type1Array;
//		ImplementationMathMatrix type2ArrayList;
//		ImplementationMathMatrix type3list;
//		ImplementationMathMatrix pType1;
//		ImplementationMathMatrix array1;
//		ImplementationMathMatrix arrayList1;
//		ImplementationMathMatrix list1;
//
//			type1Array = aufgabe2.Matrix.getMatrixOfArray(0, 0);
//			type2ArrayList = aufgabe2.Matrix.getMatrixOfArrayList(0, 0);
//			type3list = aufgabe2.Matrix.getMatrixOfList(0, 0);
//			
//			pType1 = aufgabe2.MatrixGenerator.genRandMatrix(type1Array, sice, 1.0, 10.0);
//			
//			array1 = aufgabe2.MatrixGenerator.dupMatrixToType(type1Array, pType1);
//			arrayList1 = aufgabe2.MatrixGenerator.dupMatrixToType(type2ArrayList, pType1);;
//			list1 = aufgabe2.MatrixGenerator.dupMatrixToType(type3list, pType1);;
//	}
//		
//	
}
